/*
 * @features: 功能
 * @description: 说明
 * @Date: 2021-09-25 15:27:34
 * @Author: judu233(769471424@qq.com)
 * @LastEditTime: 2021-10-14 16:13:38
 * @LastEditors: judu233
 */

import { HotUpdate } from "../../Asset/hotupdate/Hotupdate";
import { Broadcast } from "../../tool/Broadcast/broadcast";
import { Macro } from "../Macros";

/** ---------- 全局消息事件 ----------  */
//需要消息定义者，定义时添加如下类型声明
declare global {
    interface IEventKey extends broadcast.IMsgKey {
        /** 中途退出游戏后，再进入游戏 */
        GAME_ENTER: void;
        /** 中途退出游戏 */
        GAME_EXIT: void;
        /** 游戏尺寸修改事件 */
        GAME_RESIZE: void;
        /** engin开始事件 */
        ENGINE_START: void;
        /** 玩家登陆成功 */
        LOGIN_SUCCESS: void;

        /**热更新事件*/
        [HotUpdate.Event.HOTUPDATE_DOWNLOAD]: HotUpdate.Event.HOTUPDATE_DOWNLOAD;
        /**下载进度 */
        [HotUpdate.Event.DOWNLOAD_PROGRESS]: HotUpdate.Event.DOWNLOAD_PROGRESS;
        /**提示下载弹出框事件 */
        [HotUpdate.Event.DOWNLOAD_MESSAGE]: HotUpdate.Event.DOWNLOAD_MESSAGE;

        /**全屏适配 */
        [Macro.ADAPT_SCREEN]: typeof Macro.ADAPT_SCREEN;
    }
    //对应消息类型的发消息和收消息的类型声明
    interface IEventValueType extends broadcast.IMsgValueType {
        [HotUpdate.Event.HOTUPDATE_DOWNLOAD]: HotUpdate.DownLoadInfo;
        [HotUpdate.Event.DOWNLOAD_MESSAGE]: HotUpdate.MessageData;
        [HotUpdate.Event.DOWNLOAD_PROGRESS]: { progress: number, config: HotUpdate.BundleConfig };
    }
    //双向通信返回数据类型声明
    interface IEventResultType extends broadcast.IResultType {
        // ENGINE_START: 222;
    }
}
//然后在实例化broadcast时，注入类型
export default class EventBroadcast {
    ins: Broadcast<IEventKey, IEventValueType, IEventResultType>;

    private init() {
        this.ins = new Broadcast<IEventKey, IEventValueType, IEventResultType>();
    }

    private example() {
        //注册接收器
        this.ins.on('ENGINE_START', (str, callBack) => {
            //do something
            var result: void = null;
            // 返回消息
            callBack(result);
        })
        //发送消息  一个消息类型一旦持久化就只能通过 brocast.offAll(key) 来从广播系统中移除该类型的消息。
        this.ins.broadcast(
            "ENGINE_START", //消息类型key
            null,     //数据
            (result) => {
                console.log(result)
            },  //回调
            true   //持久化
        )
        //粘性广播
        this.ins.stickyBroadcast(
            'ENGINE_START',//消息类型key
            null,//数据
            (result) => {
                console.log(result)
            }, //回调
            true);//持久化
        //批量注册接收者
        this.ins.on([
            {
                key: 'ENGINE_START',//消息类型                
                listener: this.onNumberTypeTest,//接收器                
                context: this//环境
            },
            {
                key: 'ENGINE_START',//消息类型                
                listener: this.onStringTypeTest,//接收器                
                context: this//环境
            }
        ])
    }

    private onNumberTypeTest() {
    }
    private onStringTypeTest() {
    }
}